<?php

/**
 * CongMuaSam
 * Dự án congmuasam.vn
 *
 * @package     CongMuaSam
 * @author      Jin Pig <huytq@jinpig.net>
 * @copyright   Copyright (c) 2012, DTC Vietnam.
 * @link        http://congmuasam.vn
 * @version     $Id$
 */

/**
 * Lớp database
 * Đây là lớp dùng để tương tác với CSDL.
 *
 * @package     CongMuaSam
 * @subpackage  Database
 * @author      Jin Pig <huytq@jinpig.net>
 * @copyright   Copyright (c) 2012, Lifemo Dev Team.
 */
class class_db
{

	// Construct function
	function __construct()
		{
			$this->connect('localhost', 'root', '', 'congmuasam');
		}
	
    /**
     * Tên máy chủ MySQL
     *
     * @var string
     */
    private $_server = '';

    /**
     * Tên người dùng
     *
     * @var string
     */
    private $_username = '';

    /**
     * Mật khẩu
     *
     * @var string
     */
    private $_password = '';

    /**
     * Tên Cơ sở dữ liệu
     *
     * @var string
     */
    private $_database = '';

    /**
     * Cổng của MySQL
     *
     * @var string
     */
    private $_port = 3306;

    /**
     * Link identifier
     *
     * @var resource
     */
    public $link;

    /**
     * Constructor
     * Hàm này sẽ được chạy ngay sau khi lớp được khởi tạo.
     *
     * @access  public
     * @return  void
     */


    /**
     * Hàm kết nối
     * Hàm này có tác dụng tạo một kết nối tới máy chủ chạy MySQL.
     *
     * @access  public
     * @param   string  $server    (Optional) Tên máy chủ MySQL
     * @param   string  $username  (Optional) Tên người dùng
     * @param   string  $password  (Optional) Mật khẩu
     * @param   string  $dbname    (Optional) Tên Cơ sở dữ liệu
     * @param   int     $port      (Optional) Cổng của MySQL
     * @return  bool
     */
    public function connect($server = '', $username = '', $password = '', $dbname = '', $port = 3306)
    {
        $this->_server = ($server) ? $server : 'localhost';
        $this->_username = ($username) ? $username : 'root';
        $this->_password = ($password) ? $password : '';
        $this->_database = ($dbname) ? $dbname : 'database';
        $this->_port = $port;
        $this->link = @new mysqli($this->_server, $this->_username, $this->_password, $this->_database, $this->_port);

        // Nếu gặp lỗi trong quá trình kết nối
        if (is_object($this->link) !== TRUE)
        {
            return FALSE;
        }

        return TRUE;
    }

    /**
     * Hàm kiểm tra kết nối
     * Hàm này có tác dụng kiểm tra xem đã khởi tạo kết nối thành công tới máy
     * chủ MySQL hay chưa.
     *
     * @access  private
     * @return  bool
     */
    private function _isConnected()
    {
        // Nếu kết nối không phải là một đối tương
        if (is_object($this->link) === FALSE)
        {
            return FALSE;
        }

        return TRUE;
    }

    /**
     * Hàm lựa chọn CSDL
     * Hàm này có tác dụng mở một Cơ sở dữ liệu
     *
     * @access  public
     * @param   string  $dbname Tên Cơ sở dữ liệu
     * @return  bool
     */
    public function selectDb($dbname)
    {
        // Nếu chưa kết nối đến máy chủ
        if ($this->_isConnected() === FALSE)
        {
            return FALSE;
        }

        $selectDb = $this->link->select_db($dbname);

        // Nếu không thể mở Cơ sở dữ liệu
        if ($selectDb !== TRUE)
        {
            return FALSE;
        }

        return TRUE;
    }

    /**
     * Hàm escape chuỗi
     *
     * @access  public
     * @param   string  $string (Optional) Chuỗi cần escape
     * @return  bool|string
     */
    public function escapeString($string = '')
    {
        // Nếu chưa kết nối đến máy chủ
        if ($this->_isConnected() === FALSE)
        {
            return FALSE;
        }

        return $this->link->real_escape_string($string);
    }

    /**
     * Hàm thực thi truy vấn
     * Hàm này có tác dụng thực thi câu truy vấn và trả về kết quả sau câu truy 
     * vấn.
     *
     * @access  public
     * @param   string  $query  Câu lệnh SQL
     * @return  bool|object
     */
    public function query($query)
    {
        // Nếu chưa kết nối đến máy chủ
        if ($this->_isConnected() === FALSE)
        {
            return FALSE;
        }

        $result = $this->link->query($query);

        // Nếu thực thi truy vấn bị lỗi
        if ($result === FALSE)
        {
            return FALSE;
        }

        return $result;
    }

    /**
     * Hàm thực thi truy vấn
     * Hàm này có tác dụng thực thi câu truy vấn và trả về hàng
     * đầu tiên trong kết quả sau câu truy vấn.
     *
     * @access  public
     * @param   string  $query  Câu lệnh SQL
     * @return  array
     */
    public function queryFirst($query)
    {
        $result = $this->query($query);
        $array = $result->fetch_assoc();
        $result->free();

        return $array;
    }

    /**
     * Hàm update
     *
     * @access  public
     * @return  bool|object
     */
    public function update($table, $data, $where = '1')
    {
        $query = "UPDATE `$table` SET ";

        foreach ($data AS $key => $val)
        {
            if (strtolower($val) == 'null') $query .= "`$key` = NULL, ";
            elseif(strtolower($val) == 'now()') $query .= "`$key` = NOW(), ";
            else $query.= "`$key`='" . $this->escapeString($val) . "', ";
        }

        $query = rtrim($q, ', ') . ' WHERE ' . $where . ';';

        return $this->query($query);
    }

    /**
     * Hàm insert
     *
     * @access  public
     * @return  bool|int
     */
    public function insert($table, $data)
    {
        $query = "INSERT INTO `$table` ";
        $v=''; $n='';

        foreach ($data AS $key => $val)
        {
            $n .= "`$key`, ";
            if (strtolower($val) == 'null') $v .= "NULL, ";
            elseif (strtolower($val)=='now()') $v .= "NOW(), ";
            else $v .= "'" . $this->escapeString($val) . "', ";
        }

        $query .= "(". rtrim($n, ', ') .") VALUES (". rtrim($v, ', ') .");";

        if ($this->query($query) !== FALSE)
        {
            return $this->insertId();
        }

        return FALSE;
    }

    /**
     * Hàm lấy ra id của hàng vừa được thêm vào Cơ sở dữ liệu
     *
     * @access  public
     * @return  integer
     */
    public function insertId()
    {
        // Nếu chưa kết nối đến máy chủ
        if ($this->_isConnected() === FALSE)
        {
            return FALSE;
        }

        return $this->link->insert_id;
    }

    /**
     * Hàm đóng kết nối
     *
     * @access  public
     * @return  integer
     */
    public function close()
    {
        // Nếu chưa kết nối đến máy chủ
        if ($this->_isConnected() === FALSE)
        {
            return FALSE;
        }

        $close = @$this->link->close();

        // Nếu không thể đóng kết nối
        if ($close !== TRUE)
        {
            return FALSE;
        }

        return TRUE;
    }

}

/* Kết thúc tệp tin class_db.php */
